/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Ap0stoL2
 * Date: 2023-07-27
 * Time: 21:48
 */


//懒汉模式(多线程)
class SingletonLazy {
    //最开始为空
    private static volatile SingletonLazy instance = null;

    //创建一个锁对象
    private static Object locker =new Object();

    //把构造方法设置成私有,避免他人new这个对象
    private SingletonLazy() {}

    //首次运行getInstance才会创建对象
    public synchronized static SingletonLazy getInstance() {
        // synchronized相当于就是把下面这一段指令打包,这样就变成原子性的了
        //也可以写成 synchronized (SingletonLazy.class) , 把这个类对象当锁对象(只要是用这个类创建的对象调用及锁)
        //第一个if是判断是否要加锁,减少了多次阻塞的问题.第二个if是判断是否要创建对象
        if(instance == null){
            synchronized (locker){
                if (instance == null) {
                    instance = new SingletonLazy();//new这个指令是原子的
                }
            }
        }
        return instance;
    }
}

public class Demo17 {
    public static void main(String[] args) {
        SingletonLazy s1=SingletonLazy.getInstance();
        SingletonLazy s2=SingletonLazy.getInstance();
        System.out.println(s1==s2);
    }
}